package com.cn.springcloudwechat.controller.base;

import com.cn.springcloudwechat.common.ajax.AjaxRes;
import com.cn.springcloudwechat.common.utils.ThreadLocalUtil;
import com.cn.springcloudwechat.common.utils.uploadMult.UpLoadMultUtil;
import com.cn.springcloudwechat.common.utils.weixin.vo.api.Template;
import com.cn.springcloudwechat.model.YmUser;
import com.cn.springcloudwechat.model.weixin.user.Follower;
import com.cn.springcloudwechat.model.vaccine.UserEntity;
import com.cn.springcloudwechat.model.weixin.user.WxFollower;
import com.cn.springcloudwechat.service.vaccine.weixinService.WeiXinService;
import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;


public class BaseWeChatController extends BaseController<Object> {


    @Autowired
    WeiXinService weiXinService;

    /**
     * 获取openId
     *
     * @return
     */
    public String getOpenId() {
        String openId = (String) getRequest().getSession().getAttribute("openId");
        if (StringUtils.isBlank(openId)) {
            String code = getRequest().getParameter("code");
            if (StringUtils.isNotBlank(code)) {
                openId = weiXinService.getOpenId(code);
            } else {
                throw new IllegalArgumentException("code is null");
            }
        }
        return openId;
    }

    /**
     * 获取用户信息
     *
     * @return
     */
    public YmUser getUserInfo() {
        //todo
        YmUser userEntity = ThreadLocalUtil.getUser();
        return userEntity;
    }

    /**
     * 获取单个微信用户信息
     *
     * @return
     */
    public Follower getWeChatOpenInfo() {
        return weiXinService.getWXUserByOpenId(getOpenId());
    }

    /**
     * 获取微信用户信息一次拉取一百条
     *
     * @param openIds
     * @return
     */
    public List<Follower> getWeChatOpenInfos(String openIds[]) {
        return this.weiXinService.getFollowers(openIds);
    }

    /**
     * 获取带参数二维码
     *
     * @param message
     * @param sceneId
     * @方法名:getQR
     */
    public Map<String, Object> getQR(String message, String sceneId, Integer expireSeconds) {


        Map<String, Object> qrcodeMap;
        //永久二维码
        if (message.equals("1")) {
            qrcodeMap = weiXinService.geTicket(sceneId, 0);
        } else {
            if (expireSeconds == null) {
                expireSeconds = 0;
            }
            //临时二维码
            qrcodeMap = weiXinService.geTicket(sceneId, expireSeconds.intValue());
        }
        return qrcodeMap;
        /*try {
            response.getOutputStream().write(qrcodeMap.get("byte"));
        } catch (IOException e) {
            e.printStackTrace();
        }*/
    }

    /**
     * 上传临时或是永久素材
     *
     * @param index 1临时素材 其他永久素材
     * @param file
     * @return
     * @方法名:getMeaId
     * @描述:
     */
    public String getMeaId(MultipartFile file, String index) {
        // 上传服务器的包名
        String servicePath = "/upload/weixinTempPic";
        String path = UpLoadMultUtil.upLoadMult(servicePath, file, getRequest());
        // String path = request.getParameter("path");
        System.out.println("path:" + path);
      /*  String meaidList = weiXinService.getMediaId(getRequest(), path, index);
        System.out.println("resphonseText:meaid=" + meaidList);
        JSONObject jsonObject = JSONObject.fromObject(meaidList);
        String meaid = "";
        if (jsonObject.containsKey("media_id")) {
            meaid = (String) jsonObject.get("media_id");
            //删除临时文件
            //UpLoadMultUtil.delFolder(path);
        } else if (jsonObject.containsKey("thumb_media_id")) {
            meaid = (String) jsonObject.get("thumb_media_id");
        }
        if (meaid != null) {
            ajaxRes.setSucceed(meaid, "success");
        } else {
            ajaxRes.setFailMsg("failure!");
        }*/

        return ajaxRes.toJSONString();
    }

    /**
     * 获取关注者列表 一次最多10000条
     *
     * @param nextOpenId 默认为空 不为空时,从此openId开始拉取
     * @return
     * @方法名:getUserList
     * @描述:
     */
    public String getUserList(AjaxRes res, String nextOpenId) {
        String userList = weiXinService.get_user_list(nextOpenId);
        if (userList != null) {
            res.setSucceed(userList);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 批量获取用户基本信息[最多拉取100条]
     *
     * @param openid 批量用户集合{@link }
     * @return 关注用户{@link Follower}
     */
    public String getFollowers(AjaxRes res, @RequestParam(value = "openid[]") String openid[]) {
        List<Follower> followers = weiXinService.getFollowers(openid);
        if (followers != null && followers.size() != 0) {
            res.setSucceed(followers);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 添加客户账号
     *
     * @param kf_account 完整客服帐号，格式为：帐号前缀@公众号微信号，帐号前缀最多10个字符，必须是英文、数字字符或者下划线，后缀为公众号微信号，
     *                   长度不超过30个字符
     * @param nickname
     * @return
     * @方法名:addCustomer
     * @描述:
     */
    public String addCustomer(AjaxRes res, String kf_account, String nickname) throws UnsupportedEncodingException {
        String list = weiXinService.addCustomer(kf_account, nickname);
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 绑定客户到微信
     *
     * @param kf_account 完整客服帐号，格式为：帐号前缀@公众号微信号，帐号前缀最多10个字符，必须是英文、数字字符或者下划线，后缀为公众号微信号，
     *                   长度不超过30个字符
     * @param invite_wx  接收绑定邀请的客服微信号
     * @return
     * @方法名:bindingCustmoerWeixin
     * @描述:
     */
    public String bindingCustmoerWeixin(AjaxRes res, String kf_account, String invite_wx) throws UnsupportedEncodingException {
        String list = weiXinService.bindingCustmoerWeixin(kf_account, invite_wx);
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 上传客户头像
     *
     * @param res
     * @param request
     * @param file
     * @param kf_account 完整客服帐号，格式为：帐号前缀@公众号微信号
     * @return
     * @方法名:uploadCustomerHeadurl
     * @描述:
     */
    public String uploadCustomerHeadurl(AjaxRes res, HttpServletRequest request,
                                        @RequestParam(value = "file") MultipartFile file, String kf_account) {
        // 上传服务器的包名
        String servicePath = "/upload/user/weixinHeader";
        String path = UpLoadMultUtil.upLoadMult(servicePath, file, request);
        System.out.println("path:" + path);
        String list = weiXinService.uploadCustomerHeadurl(kf_account, path);
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 获取客户基本信息
     *
     * @param res
     * @return
     * @方法名:getCustomer
     * @描述:
     */
    public String getCustomer(AjaxRes res) {
        String list = weiXinService.getCustomer();
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 修改客户信息
     *
     * @param res
     * @param kf_account
     * @param nick_name
     * @return
     * @方法名:updateCustomer
     * @描述:
     */

    public String updateCustomer(AjaxRes res, String kf_account, String nick_name) throws UnsupportedEncodingException {
        String list = weiXinService.updateCustomer(kf_account, nick_name);
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 创建会话
     *
     * @param kf_account
     * @param openid
     * @return
     * @方法名:createDialogue
     * @描述:
     */

    public String createDialogue(AjaxRes res, String kf_account, String openid) throws UnsupportedEncodingException {
        // kf_account=kf2001&openid=o7G2uwzSwARLYvyXv9gHkcIM97EI(秀竹)
        // o7G2uwyCYxFpInF-aC9_d8sNIAgE
        String list = weiXinService.createDialogue(kf_account, openid);
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();

    }

    /**
     * 关闭某个客户的会话
     *
     * @param openid
     * @return
     * @方法名:deleteDialogue
     * @描述:
     */

    public String deleteDialogue(AjaxRes res, String kf_account, String openid) throws UnsupportedEncodingException {
        String list = weiXinService.deleteDialogue(kf_account, openid);
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 获取客户会话状态
     *
     * @param openid
     * @return kf_acount 正在接待的客服，为空表示没有人在接待 createtime 会话接入的时间
     * @方法名:getDialogueStatus
     * @描述:
     */
    public String getDialogueStatus(AjaxRes res, String openid) {
        String list = weiXinService.getDialogueStatus(openid);
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 获取客服会话列表
     *
     * @param kf_account
     * @return
     * @方法名:getCustomerList
     * @描述:
     */
    public String getCustomerList(AjaxRes res, String kf_account) {
        String list = weiXinService.getCustomerList(kf_account);
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 获取客户未接入会话列表
     *
     * @return
     * @方法名:noDialogue
     * @描述:
     */
    public String noDialogue(AjaxRes res) {
        String list = weiXinService.noDialogue();
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 获取聊天记录
     *
     * @return worker 完整客服帐号，格式为：帐号前缀@公众号微信号 openid 用户标识 opercode
     * 操作码，2002（客服发送信息），2003（客服接收消息） text 聊天记录 time 操作时间，unix时间戳
     * 若获取的number和请求的number一致 则可能会有聊天记录没获取完,再次拉取msgid和返回设置为一样再次请求此接口
     * @方法名:getChatRecord starttime 起始时间， unix时间戳 endtime
     * 结束时间，unix时间戳，每次查询时段不能超过24小时 msgid 消息id顺序从小到大，从1开始
     * number 每次获取条数，最多10000条
     * @描述:
     */
    public String getChatRecord(AjaxRes res, String starttime, String endtime, String msgid, String number) throws UnsupportedEncodingException {
        String list = weiXinService.getChatRecord(starttime, endtime, msgid, number);
        if (list != null) {
            res.setSucceed(list);
        } else {
            res.setFailMsg("failure!");
        }
        return res.toJSONString();
    }

    /**
     * 根据模板编码获取模板id
     * @param tmcode
     * @return
     */
    public String getTemplateId(String tmcode) {
        String templateId = weiXinService.getTemplateId(tmcode);
        return templateId;
    }

    /**
     * 发送模板
     * @param openId
     * @param tmlId
     * @param topColor
     * @param url
     * @param tmls
     * @return
     */
    public long sendTemplateMsg(String openId, String tmlId, String topColor, String url, Template... tmls) {
        return weiXinService.sendTemplateMsg(openId, tmlId, topColor, url,tmls);
    }

    /**
     * 获取模板
     * @return
     */
    public String getTemplateId() {
        String templateId = weiXinService.getTemplateId();
        return templateId;
    }
}
